package com.liming.stock.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.liming.common.enums.DateScopeEnum;
import com.liming.common.pojo.dto.stock.AddStockFlowDTO;
import com.liming.common.pojo.dto.stock.StockFlowPageQuery;
import com.liming.common.pojo.dto.stock.UserOrderStockFlowDTO;
import com.liming.common.pojo.entity.stock.StockFlow;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.stock.ProductSalesCountVO;
import com.liming.common.pojo.vo.stock.StockDashboardVO;
import com.liming.common.pojo.vo.stock.StockFlowVO;

import java.util.List;

/**
 * @author liming
 * @date 2025/1/21
 */
public interface StockFlowMircoService extends IService<StockFlow> {

    /**
     * 新增库存流水 - 管理员相关
     *
     * @param addStockFlowDTO 新增库存流水DTO
     * @return 新增库存流水结果
     */
    Boolean adminStockFlow(AddStockFlowDTO addStockFlowDTO);

    /**
     * 分页 - 库存流水
     *
     * @param query 分页查询条件
     * @return 库存流水分页VO
     */
    PageVO<StockFlowVO> pageFlow(StockFlowPageQuery query);

    /**
     * 根据订单ID 查询锁定库存列表
     *
     * @param orderId 订单ID
     * @return 锁定库存列表
     */
    List<StockFlow> listLockFlowByOrderId(Long orderId);

    /**
     * 用户下单 - 未支付 - 库存流水 - 锁定库存
     *
     * @param userOrderStockFlowDTO 用户下单 - 库存流水 相关信息
     * @return 新增库存流水结果
     */
    Boolean userOrderLockStockFlow(UserOrderStockFlowDTO userOrderStockFlowDTO);

    /**
     * 用户下单 - 已支付 | 库存流水 - 出库
     *
     * @param orderId 订单号
     * @return 新增出库流水结果
     */
    Boolean userOrderOutStockFLow(Long orderId);

    /**
     * 用户下单 - 未支付 - 取消支付 - 解锁库存 | 库存流水 - 库存解锁
     *
     * @param orderId 订单ID
     * @return 新增解锁库存结果
     */
    Boolean userOrderUnlockStockFLow(Long orderId);

    /**
     * 库存流水大屏
     *
     * @param scope 范围
     * @return 库存流水大屏VO
     */
    StockDashboardVO flowDashboard(String scope);

    /**
     * 商品出库流水 - 根据时间范围
     *
     * @param dateScopeEnum 时间枚举
     * @return 商品 - 出库数量
     */
    List<ProductSalesCountVO> salesCountByTime(DateScopeEnum dateScopeEnum);

    /**
     * 热销商品IDS
     *
     * @return 热销商品IDS
     */
    List<Long> hotSalesProductIds();

    /**
     * 根据订单ID 查询出库流水
     *
     * @param orderId 订单ID
     * @return 出库流水
     */
    List<StockFlow> listOutFlowByOrderId(Long orderId);

    /**
     * 退款成功 - 新增库存流水
     * @param orderId 订单ID
     * @return 出库流水
     */
    List<StockFlow> addRefundFlowBecauseRefundSuccess(Long orderId);
}
